<?php

/* 27/07/2011

   En este modulo llevaran a cabo los servicio para el usuario
   que seran llamados por el servicio web (Representational State Transfer)

 -trim       = elimina espacion en blanco en la cadena a los extremos.
 -strtolower = toda la cadena a minuscula.

 */

class xml_servicio_usuarioActions extends sfActions
{

public function executeIndex(sfWebRequest $request)
{

}



/*
    Este servicio sirve para verificar si el usuario y constrase単a
    son correctos.
   -El metododo "executeToken" verifica un codigo de seguridad
    para asegurarnos que el servicio lo esta una de las plataformas
    asociadas (devuelve true o false)
 */
public function executeLogin(sfWebRequest $request)
{

    $request->setRequestFormat('xml');
    //obteniedo los datos
    $email           = $request->getParameter('email');
    $password        = $request->getParameter('password');
    $token_seguridad = $request->getParameter('token');
    $plataforma = $request->getParameter('plataforma');
    $id_plataforma = $request->getParameter('Idplataforma');

    $recurso = new myLib();


    try {

        //verificando si el codigo es correcto
        if($recurso->executeToken($token_seguridad)){
            $criterio = new Criteria();
            $criterio->add(UsuarioPeer::EMAIL,    $email);
            $criterio->add(UsuarioPeer::PASSWORD, $password);
            //verificado si la el usuario y la constraseña es correcta
            if(UsuarioPeer::doCount($criterio)>0){
                $user  =  UsuarioPeer::doSelectOne($criterio);
                //verificar si el usuario no se ecuentra la la tabla tmp_usuario_registro
                //si en caso se encontrara ahi ...significa que el usuario se registro pero
                //no verifico su cuenta en su correo
             $crite = new Criteria();
             $crite->add(TmpUsuarioRegistroPeer::USUARIO_ID,$user->getId());
                  
             if(TmpUsuarioRegistroPeer::doCount($crite)==0){                  
                  $cri = new Criteria();
                  $cri->add(PlataformaPeer::DESCRIPCION,'%'.$plataforma.'%',Criteria::LIKE);
                  $plataforma =  PlataformaPeer::doSelectOne($cri);
                  $cri->clear();
                  $cri->addSelectColumn(PaquetePeer::ID);
                  $cri->add(UsuarioPaquetePeer::USUARIO_ID,$user->getId());
                  $cri->add(PaquetePeer::PLATAFORMA_ID,$plataforma->getId());
                  $cri->addJoin(UsuarioPaquetePeer::PAQUETE_ID, PaquetePeer::ID);
                  $cri->addJoin(PaquetePeer::PLATAFORMA_ID, PlataformaPeer::ID);
                  $paquete = PaquetePeer::doSelectStmt($cri);
                  $valor = 'null';
                  if(is_object($paquete)){                         
                         foreach($paquete as $item){
                             $valor =  $item[0];
                         }
                  }

                  $recurso = new myLib();
                  $respuesta = $recurso->verificar_por_plataforma($email,$id_plataforma);

                   if($respuesta==2){
                        //Usuario existe pero no existe en plataforma!
                          $this->paquete_id = $valor;
                          $this->usuario = $user;
                          $this->code_rpt = 20009;
                          return sfView::SUCCESS;
                    }else{
                        //Usuario existe en Practil y existe en plataflorma
                          $this->paquete_id = $valor;
                          $this->usuario = $user;
                          $this->code_rpt = 10006;
                          return sfView::SUCCESS;
                    }

                 
                  
                }else{
                   $tmp_user =  TmpUsuarioRegistroPeer::doSelectOne($crite);
                   $this->token = $tmp_user->getToken();
                   $this->code_rpt = 20004;
                   return sfView::ERROR;
                }
                
            }else{
                 $this->usuasrio = null;
                 $this->code_rpt = 10007;
                 return sfView::SUCCESS;
            }
        }else{
             $this->code_rpt = 20001;
             return sfView::ERROR;
        }
    }catch (sfValidatorError $exc){
               $this->code_rpt = 20010;
               return sfView::ERROR;
     }



}


public function executeActivar_usuario(sfWebRequest $request)
{
     $token_seguridad = $request->getParameter('token');
     $email           = $request->getParameter('email');

}

/*Este metodo asocia un usuario a una plataforma (aceptor,opinisc , etc...)

 */
public function executeAsociar_plataforma(sfWebRequest $request){
    $request->setRequestFormat('xml');

    $email           = $request->getParameter('email');
    $plataforma      = $request->getParameter('plataforma');
    $token_seguridad = $request->getParameter('token');
    $recurso = new myLib();

    //verificando si el codigo es correcto
    if($recurso->executeToken($token_seguridad)){
            if($recurso->executeVerificarPlataforma($plataforma)){
          //si esta disponible valido datos
            $vEmail = new sfValidatorEmail(array('required'=>true));
            $vString= new sfValidatorString(array('required'=>true));

            try {
            $vEmail->clean(strtolower(trim($email)));
            } catch (sfValidatorError $exc) {
               $this->code_rpt = 20002;
               return sfView::ERROR;
            }
            try {
            $vString->clean(strtolower(trim($plataforma)));
            } catch (sfValidatorError $exc) {
               $this->code_rpt = 20002;
               return sfView::ERROR;
            }

            try {
                     // si no entro en los  catch
                    $con = Propel::getConnection();
                    $con->beginTransaction();
                    $criterio = new Criteria();
                    $criterio->add(UsuarioPeer::EMAIL,'%'.$email.'%',Criteria::LIKE);
                    $usuario = UsuarioPeer::doSelectOne($criterio);
                    $usuario->setPlataforma($usuario->getPlataforma().$plataforma.'-' );
                    $usuario->save();
                    $criterio->clear();
                    //actualizo datos
                    $criterio->add(UsuarioAuditoriaPeer::USUARIO_ID,$usuario->getId());
                    $auditoria = UsuarioAuditoriaPeer::doSelectOne($criterio);
                    $auditoria->setFechaActualizacion(time());
                    $auditoria->save();
                    $con->commit();
                    $this->id = $usuario->getId();
                    $this->code_rpt =10009;
                    return sfView::SUCCESS;
            }catch (sfValidatorError $exc) {
               $con->rollBack();
               $this->code_rpt = 20003;
               return sfView::ERROR;
            }

        }else{
            $this->code_rpt = 10005;
            return sfView::ERROR;
            }
    }else{
        $this->code_rpt = 20001;
        return sfView::ERROR;
    }

}


public function executeRegistrar(sfWebRequest $request)
{
    $request->setRequestFormat('xml');
    //obteniedo los datos
    $nombre          = $request->getParameter('nombre');
    $apellido        = $request->getParameter('apellido');
    $password        = $request->getParameter('password');
    $email           = $request->getParameter('email');
    $plataforma      = $request->getParameter('plataforma');
    $tipo_registro   = $request->getParameter('tipo_registro');
    $token_seguridad = $request->getParameter('token');
    $recurso = new myLib();

    //verificando si el codigo es correcto
    if($recurso->executeToken($token_seguridad)){
        if($recurso->executeVerificar($email)){
            if($recurso->executeVerificarPlataforma($plataforma)){
          //si esta disponible valido datos
            $vEmail = new sfValidatorEmail(array('required'=>true));
            $vString= new sfValidatorString(array('required'=>true));

            try {
            $vEmail->clean(strtolower(trim($email)));
            } catch (sfValidatorError $exc) {
               $this->code_rpt = 20002;
               return sfView::ERROR;
            }
            try {
            $vString->clean(strtolower(trim($plataforma)));
            } catch (sfValidatorError $exc) {
               $this->code_rpt = 20002;
               return sfView::ERROR;
            }
            try {
            $vString->clean($password);
            } catch (sfValidatorError $exc) {
               $this->code_rpt = 20002;
               return sfView::ERROR;
            }
            try {
                     // si no entro en los  catch
                    $con = Propel::getConnection();
                    $con->beginTransaction();
                    $nuevo_usuario = new Usuario();
                    $nuevo_usuario->setNombre    ( strtolower(trim($nombre)) );
                    $nuevo_usuario->setApellido  ( strtolower(trim($apellido)) );
                    $nuevo_usuario->setEmail     ( strtolower(trim($email)) );
                    $nuevo_usuario->setPassword  ( $password );
                    $nuevo_usuario->setPlataforma( $plataforma.'-' );
                    $nuevo_usuario->setNacionalidad ("");
                    $nuevo_usuario->setLocalidad("");
                    $nuevo_usuario->setSexo("");
                    $nuevo_usuario->setFechaNacimiento("01-01-1980");
                    $nuevo_usuario->setIdioma ("ES");
                    $nuevo_usuario->setUsuarioTipoId(1);
                    //donde ["pk de la tabla flag"-"estado del flag"]
                    $nuevo_usuario->setFlag("1-1*2-0*3-1");
                    $nuevo_usuario->save();

                    //el token para que pueda activar su cuenta
                    /*Tipo de confirmacion:
                     1=nesecita confirmacion
                     2=sin confirmacion
                     */
                    if($tipo_registro==1){
                        $token = new TmpUsuarioRegistro();
                        $token_aux = md5(rand(100000,999999));
                        $token->setToken($token_aux);
                        $token->setFechaActualizacion(time());
                        $token->setUsuarioId($nuevo_usuario->getId());
                        $token->save();
                    }else{
                        $token_aux='null';
                    }
                    

                    //registro los datos
                    $auditoria = new UsuarioAuditoria();
                    $auditoria->setFechaRegistro(time());
                    $auditoria->setFechaActualizacion(time());
                    $auditoria->setUsuarioId($nuevo_usuario->getId());
                    $auditoria->save();
                    $con->commit();
                    $this->id = $nuevo_usuario->getId();
                    $this->token = $token_aux;
                    $this->code_rpt = 10004;
                    return sfView::SUCCESS;
            }catch (sfValidatorError $exc) {
               $con->rollBack();
               $this->code_rpt = 10003;
               return sfView::ERROR;
            }

        }else{
            $this->code_rpt = 10005;
            return sfView::ERROR;
            }
        }else{
            $this->code_rpt = 10003;
            return sfView::ERROR;
        }
    }else{
        $this->code_rpt = 20001;
        return sfView::ERROR;
    }
}


/*
    Este servicio sirve para verificar si el usuario existe en la base
    de datos ... el metododo "executeToken" verifica un codigo de seguridad
    para asegurarnos que el servicio lo esta una de las plataformas
    asociadas (devuelve true o false)
 */
public function executeVerificar_disponibilidad(sfWebRequest $request)
{
      $request->setRequestFormat('xml');
    //obteniedo los datos
      $email           = $request->getParameter('email');
      $token_seguridad = $request->getParameter('token');
      $pk_plataforma   = $request->getParameter('plataforma_key');
      $recuso = new myLib();

    //verificando si el codigo es correcto
    if($recuso->executeToken($token_seguridad)){
        /*Verificar si esta disponible por plataforma*/

        $respuesta = $recuso->verificar_por_plataforma($email , $pk_plataforma );

        if($respuesta==1){
            //Usuario disponible-Registrar
             $this->code = 10001;
             $this->respt = 'true';
             return sfView::SUCCESS;
        }elseif($respuesta==2){
            //Usuario disponible-Actualizar
             $this->code = 10002;
             $this->respt = 'true';
             return sfView::SUCCESS;
        }else{
            //Usuario ya existe en Practil y existe en plataflorma
             $this->code = 10008;
             $this->respt = 'true';
             return sfView::ERROR;
        }

    }else{
        $this->code = 20001;
        $this->respt = 'false';
        return sfView::ERROR;
    }
}


public function executeCaracteristicas_paquete(sfWebRequest $request)
{
      $request->setRequestFormat('xml');
      //obteniedo los datos
      $token_seguridad = $request->getParameter('token');
      $pk_paquete      = $request->getParameter('id_paquete');
      $recurso = new myLib();

      if($recurso->executeToken($token_seguridad)){
              $lib = new myLib();
              $paquete = $lib->executeRetorna_paquete($pk_paquete);
              if($paquete!=null){
                    $criterio = new Criteria();
                    $criterio->add(DetallePaqueteCaracteristicaPeer::PAQUETE_ID,$pk_paquete);
                    $caracteristicas = DetallePaqueteCaracteristicaPeer::doSelect($criterio);
                    $this->paquete          = $paquete;
                    $this->caracteristicas = $caracteristicas;
                    $this->code = 21111;
                     return sfView::SUCCESS;
              }else{
                $this->code = 21001;
                return sfView::ERROR;
              }
      }else{
            $this->code = 20001;
            return sfView::ERROR;
       }
}


public function executeRecuperar_password(sfWebRequest $request)
{

}
// Servicio Sirve para retornar un objeto usuario recibiendo como parametro el email 
public function executeRetornar_usuario_practil(sfWebRequest $request)
{
      
      $request->setRequestFormat('xml');
      //obteniedo los datos
      $token_seguridad = $request->getParameter('token');
      $email_usuario = $request->getParameter('email');
      $recurso = new myLib();
if($recurso->executeToken($token_seguridad)){
      try{
      $usuario_encontrado = $recurso->executeRetorna_usuario_email($email_usuario);
      $this->code = "60001"; //retorno con exito
      $this->usuario = $usuario_encontrado;
      return sfView::SUCCESS;
      }catch (sfValidatorError $exc) {
              $this->code = "60002"; // ocurrio error interno en la consulta
              $this->usuario = null;
               return sfView::ERROR;
            }
}else{
 $this->code = "60003"; // token de seguridad incorrectO
 $this->usuario = null;
return sfView::ERROR;
}
     
}
//el servicio recibe como parametro el email y el password 
//y verifica que sean correctos 
// devuelve false en caso no lo sea y true si la autenticacion es correcta
public function executeVerificar_autenticacion(sfWebRequest $request)
{
      
      $request->setRequestFormat('xml');
      //obteniedo los datos
      $token_seguridad = $request->getParameter('token');
      $email_usuario = $request->getParameter('email');
      $password = $request->getParameter('password');
      $recurso = new myLib();
if($recurso->executeToken($token_seguridad)){
      try{
      $usuario_encontrado = $recurso->executeRetorna_usuario_email($email_usuario);
      
      if(is_object($usuario_encontrado) || $usuario_encontrado != null ){
      $pass_usuario = $usuario_encontrado->getPassword();
      if($password  == $pass_usuario){ //son claves iguales
      $this->code = "60010"; // Autenticacion correcta
      return sfView::SUCCESS;
      }else{
        $this->code = "60011"; // Autenticacion Erronea
      return sfView::ERROR;
      }
      
      }else{
       $this->code = "60012"; // Usuario no Exis
      return sfView::ERROR;
      }
      
      }catch (sfValidatorError $exc) {
              $this->code = "60002"; // ocurrio error interno en la consulta
               return sfView::ERROR;
            }
}else{
 $this->code = "60003"; // token de seguridad incorrectO

return sfView::ERROR;
}
     
}

}
